Dynamic Inference of Static Types for Ruby
Rubyのようなプログラミング言語をターゲットに型推論したい。evalなどの動的な要素があって難しいので、それぞれの未知な型に対して部分型の形で制約を記録しながら実際にプログラムを実行し、制約を解くことで型を求める。 型はvariables + top + bottom + nominal types (e.g., Integer) + structural types(どのメソッドを持っているか)+ union + intersection。
例:median: [sort!: () -> Array<Numeric>; size: () -> Numeric; '[]': (Numeric) -> Numeric] -> Numeric
計算時間は、4コア・メモリ8 GBなMac Proを使って100行くらいのコードに対して1~数十秒くらい。
nekketsuuu.icon define_methodとかを扱うのは難しそう。
nekketsuuu.icon Structural typesが連続してもユーザーとしては見づらいなあ。おそらく制約の解き方の話になりそう。
この論文ではなるべくgeneralな型を求めるためにメソッドの引数の型は上界を、返り値の型は下界を求めようとしているのでこうなる。
Structural typesもunionもintersectionも入っているので、generalな型の選び方には恣意がありそう?
nekketsuuu.icon ここまで実際にコードを動かしてしまうと、実際にコードを書いていく上では型推論より先に行われるコード実行の部分で method missing はある程度見つかりそうなので、応用範囲がどこまでなのかは気になります。